package conf

import (
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"path/filepath"
	"time"
)

var Logger *zap.SugaredLogger

func InitLogger() {
	// 第一个参数配置要输出的日志格式
	// 第二个参数是配置输出目的地（输出到日志文件，还是输出到控制台）
	// 第三个参数是定义日志输出级别
	logMode := zapcore.InfoLevel
	//if !viper.GetBool("mde.develop") {
	//	logMode = zapcore.InfoLevel
	//}
	core := zapcore.NewCore(getEncoder(), getWriteSyncer(), logMode)
	// 如果想日志文件即输出到日志又输出到 console ，第二个参数配置成多输出方法
	//core := zapcore.NewCore(getEncoder(), zapcore.NewMultiWriteSyncer(getWriteSyncer(), zapcore.AddSync(os.Stdout)), logMode)
	Logger = zap.New(core).Sugar()
}

// 定义输出日志格式方法
func getEncoder() zapcore.Encoder {
	encoderConfig := zap.NewProductionEncoderConfig()
	// 修改默认字段 key 名称
	encoderConfig.TimeKey = "time"
	// 将 Level 字段的 value 值输出为大写
	encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
	// 时间的格式化
	encoderConfig.EncodeTime = func(t time.Time, encoder zapcore.PrimitiveArrayEncoder) {
		//encoder.AppendString(t.Local().Format("2006-01-02 15:04:05"))
		encoder.AppendString(t.Local().Format(time.DateTime))
	}
	return zapcore.NewJSONEncoder(encoderConfig)
}

// 定义输出目的
func getWriteSyncer() zapcore.WriteSyncer {
	// 定义路径分割符
	stSeparator := string(filepath.Separator)
	// 拿到当前工作目录
	stRootDir, _ := os.Getwd()
	// 定义一个文件路径
	stLogFilePath := stRootDir + stSeparator + "log" + stSeparator + time.Now().Format(time.DateOnly) + ".log"

	// 定义日志切割
	lumberjack := &lumberjack.Logger{
		Filename:   stLogFilePath,
		MaxSize:    viper.GetInt("log.MaxSize"), // megabytes
		MaxBackups: viper.GetInt("log.MaxBackups"),
		MaxAge:     viper.GetInt("log.MaxAge"), //days
		Compress:   false,                      // disabled by default
	}

	// 返回一个输出目标
	return zapcore.AddSync(lumberjack)
}
